<?php

include_once 'Class.Conexao.php';

class CriaDO {

    private $nomeClasse;
    private $tabelaPropriedade;
    private $tabelaMetodo;
    private $chavePrimaria;
    private $modulo;
    private $tabela;
    private $colunas;
    private $quantidade = 0;
    private $versao = '1.0';
    private $criadoPor = 'Class.CriaDo_arquivos.php';
    private $dataCriacao;
    private $pdo;
    private $diretorioDao;
    private $diretorioPhp;
    private $diretorioTpl;
    private $condicaoIdEdicao;

    function __construct() {
        $this->dataCriacao = date("d/m/Y H:i:s");
        $this->pdo = Conexao::open('sistema');
    }

    public function cria($modulo, $tabela) {
        $this->tabela = $tabela;
        $this->modulo = $modulo;
        $this->quantidade++;
//        $this->diretorioPhp = 'teste';
//        $this->diretorioTpl = 'teste';
//        $this->diretorioDao = 'teste';
        $this->diretorioPhp = "../{$this->modulo}";
//        $this->diretorioTpl = "../{$this->modulo}/templates";
        $this->diretorioTpl = "../{$this->modulo}/templates/";
        $this->diretorioDao = "do";
        $this->condicaoIdEdicao = false;

        try {

            $sqlColunas = "
                SELECT
                    column_name AS nome_coluna,
                    data_type,
                    udt_name,
                    character_maximum_length,
                    is_nullable
                FROM information_schema.COLUMNS
                WHERE table_name = :tabela AND table_schema = :modulo
                ORDER BY ordinal_position ASC
                ";
            $consulta = $this->pdo->prepare($sqlColunas);
            $consulta->bindParam(':tabela', $this->tabela, PDO::PARAM_STR);
            $consulta->bindParam(':modulo', $this->modulo, PDO::PARAM_STR);
            $consulta->execute();
            $retornoConsulta = $consulta->fetchAll(PDO::FETCH_ASSOC);

            $campos = array();
            foreach ($retornoConsulta as $linha) {
                $campos[$linha['nome_coluna']]['nome_coluna'] = $linha['nome_coluna'];
                $campos[$linha['nome_coluna']]['data_type'] = $linha['data_type'];
                $campos[$linha['nome_coluna']]['udt_name'] = $linha['udt_name'];
                $campos[$linha['nome_coluna']]['character_maximum_length'] = $linha['character_maximum_length'];
                $campos[$linha['nome_coluna']]['nulo'] = ($linha['is_nullable'] == 'YES') ? 'sim' : 'nao';
                $campos[$linha['nome_coluna']]['tipo_input'] = ($linha['data_type'] == 'boolean') ? 'checkbox' : 'text';
                switch ($linha['data_type']) {
                    case 'numeric': $mascara = 'moeda'; break;
                    case 'timestamp without time zone': case 'timestamp with time zone': case 'timestamp': case 'date': $mascara = 'data'; break;
                    default: $mascara = ''; break;
                }
                $campos[$linha['nome_coluna']]['mascara'] = $mascara;
                
                if($linha['nome_coluna'] == 'id_edicao')
                    $this->condicaoIdEdicao = true;
            }

            $sqlReferencia = "
                SELECT
                    n.nspname AS esquema,
                    cl.relname AS tabela,
                    a.attname AS coluna,
                    ct.conname AS chave,
                    nf.nspname AS esquema_ref,
                    clf.relname AS tabela_ref,
                    af.attname AS coluna_ref
                FROM
                    pg_catalog.pg_attribute a
                    JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
                    JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
                    JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
                    JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
                    JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
                    JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND af.attnum = ct.confkey[1])
                WHERE
                    cl.relname = :tabela AND
                    n.nspname = :modulo
                ";
            $consultaReferencia = $this->pdo->prepare($sqlReferencia);
            $consultaReferencia->bindParam(':tabela', $this->tabela, PDO::PARAM_STR);
            $consultaReferencia->bindParam(':modulo', $this->modulo, PDO::PARAM_STR);
            $consultaReferencia->execute();
            $retornoConsultaReferencia = $consultaReferencia->fetchAll(PDO::FETCH_ASSOC);

            foreach ($retornoConsultaReferencia as $linha) {
                $campos[$linha['coluna']]['foreign_key'] = 'sim';
                $campos[$linha['coluna']]['esquema_ref'] = $linha['esquema_ref'];
                $campos[$linha['coluna']]['tabela_ref'] = $linha['tabela_ref'];
                $campos[$linha['coluna']]['coluna_ref'] = $linha['coluna_ref'];

                $consulta = $this->pdo->prepare($sqlColunas);
                $consulta->bindParam(':tabela', $linha['tabela_ref'], PDO::PARAM_STR);
                $consulta->bindParam(':modulo', $linha['esquema_ref'], PDO::PARAM_STR);
                $consulta->execute();
                $retornoConsultaReferencia = $consulta->fetchAll(PDO::FETCH_ASSOC);

                $tem = false;
                foreach ($retornoConsultaReferencia as $linhaReferencia) {
                    if ($linhaReferencia['udt_name'] != "int4" && (!$tem)) {
                        $campos[$linha['coluna']]['nome_coluna_ref'] = $linhaReferencia['nome_coluna'];
                        $tem = true;
                    }
                }
            }

            $sqlChavePrimaria = "
                SELECT column_name AS nome_coluna, ordinal_position
                FROM information_schema.table_constraints AS tc
                JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
                WHERE tc.constraint_schema = :modulo AND tc.table_name = :tabela AND constraint_type = 'PRIMARY KEY'
                ";
            $consultaChavePrimaria = $this->pdo->prepare($sqlChavePrimaria);
            $consultaChavePrimaria->bindParam(':tabela', $this->tabela, PDO::PARAM_STR);
            $consultaChavePrimaria->bindParam(':modulo', $this->modulo, PDO::PARAM_STR);
            $consultaChavePrimaria->execute();
            $retornoChavePrimaria = $consultaChavePrimaria->fetchAll(PDO::FETCH_ASSOC);

            $this->chavePrimaria = false;

            foreach ($retornoChavePrimaria as $linha) {
                if ($linha['ordinal_position'] == 1) {
                    if ($linha['nome_coluna'] == "id_{$this->tabela}")
                        $this->chavePrimaria = true;
                }
                $campos[$linha['nome_coluna']]['primary_key'] = 'sim';
            }

            $this->colunas = $campos;
            $tabelaEmPartes = explode("_", $this->tabela);
            $this->nomeClasse = str_replace(' ', '', ucwords($this->modulo . ' ' . implode(" ", $tabelaEmPartes)));
            $this->tabelaPropriedade = $this->getNomePropriedade($this->tabela);
            $this->tabelaMetodo = $this->getNomeMetodo($this->tabela);

            // *****************************************************************
            // ************************** CLASS DTO ****************************
            // *****************************************************************
            $this->criaDTO();

            // *****************************************************************
            // ************************** CLASS DAO ****************************
            // *****************************************************************
            $this->criaDAO();

            // *****************************************************************
            // ************************* CLASS EXECUTA *************************
            // *****************************************************************
            $this->criaExcuta();

            // *****************************************************************
            // ************************* ARQUIVOS CRUD *************************
            // *****************************************************************
            $this->criaArquivoListagemPhp();
            $this->criaArquivoListagemTpl();
            $this->criaArquivoCadastroPhp();
            $this->criaArquivoCadastroTpl();
            $this->criaArquivoVisualizarPhp();
            $this->criaArquivoVisualizarTpl();

            $pdo = null;
            echo "{$this->quantidade} - Pronto a tabela {$this->modulo}.{$this->tabela}<br />";
        } catch (PDOException $e) {
            echo "{$this->quantidade} - Erro a tabela {$this->modulo}.{$this->tabela}<br />";
        }
    }

    /* funções */

    private function criaArquivoListagemPhp() {
        @unlink("{$this->diretorioPhp}/listagem_{$this->modulo}_{$this->tabela}.php");

        $fp = fopen("{$this->diretorioPhp}/listagem_{$this->modulo}_{$this->tabela}.php", "a");
        fwrite($fp, "<?php\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Listagem gerada automaticamente pela classe Class.CriaDO_arquivos.php\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");

        fwrite($fp, " */\r\n");
        fwrite($fp, "function __autoload(\$classe) { \r\n");
        fwrite($fp, "    \$pastas = array('classes', '../classes', '../secretaria/classes', '../classes/do'); \r\n");
        fwrite($fp, "    foreach (\$pastas as \$pasta) { \r\n");
        fwrite($fp, "        if (file_exists(\"{\$pasta}/Class.{\$classe}.php\")) \r\n");
        fwrite($fp, "            include_once \"{\$pasta}/Class.{\$classe}.php\"; \r\n");
        fwrite($fp, "    } \r\n");
        fwrite($fp, "} \r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "\$sessao = new Sessao(); \r\n");
        fwrite($fp, "if (!\$sessao->verificaSessao()) { \r\n");
        fwrite($fp, "    echo 'session_erro'; \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "}\r\n");
        fwrite($fp, "include_once 'configuracao.php'; \r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "\$permissao = new Permissao(); \r\n");
        fwrite($fp, "\$permissao->setIdUsuario(\$sessao->getValor('sessao_id_usuario')); \r\n");
        fwrite($fp, "\$permissao->verifica('{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php'); \r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "if (!\$permissao->getPermissao()) { \r\n");
        fwrite($fp, "    header('Location: ../erro.php?erro=permissao'); \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "} else { \r\n");
        fwrite($fp, "    if (\$permissao->getPermissao('Inserir')) \r\n");
        fwrite($fp, "        \$smarty->assign('botao_inserir', 'sim'); \r\n");
        fwrite($fp, "    if (\$permissao->getPermissao('Editar')) \r\n");
        fwrite($fp, "        \$smarty->assign('botao_editar', 'sim'); \r\n");
        fwrite($fp, "    if (\$permissao->getPermissao('Excluir')) \r\n");
        fwrite($fp, "        \$smarty->assign('botao_excluir', 'sim'); \r\n");
        fwrite($fp, "    if (\$permissao->getPermissao('Visualizar')) \r\n");
        fwrite($fp, "        \$smarty->assign('botao_visualizar', 'sim'); \r\n");
        fwrite($fp, "    if (\$permissao->getPermissao('Extra')) \r\n");
        fwrite($fp, "        \$smarty->assign('botao_extra', 'sim'); \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");

        fwrite($fp, "try { \r\n");
        fwrite($fp, "    \$pdo = Conexao::open('sistema'); \r\n");

        fwrite($fp, "    \r\n");
        fwrite($fp, "    \$idEdicao = \$sessao->getValor('sessao_id_edicao'); \r\n");

        fwrite($fp, "    \r\n");
        fwrite($fp, "    \$sql = \" \r\n");
        fwrite($fp, "        SELECT \r\n");
        
        foreach ($this->colunas as $key => $value) {
            $virgula = ($key != array_pop(array_keys($this->colunas))) ? "," : "";

            if($value['data_type'] == 'date' || $value['data_type'] == 'timestamp without time zone' || $value['data_type'] == 'timestamp with time zone') {
        fwrite($fp, "            TO_CHAR({$this->tabela}.{$value['nome_coluna']}, 'dd/mm/yyyy') AS {$value['nome_coluna']}{$virgula} \r\n");
            } else {
        fwrite($fp, "            {$this->tabela}.{$value['nome_coluna']}{$virgula} \r\n");
            }
        }
        fwrite($fp, "        FROM {$this->modulo}.{$this->tabela} \r\n");
        if ($this->condicaoIdEdicao)
        fwrite($fp, "        WHERE {$this->tabela}.id_edicao = {\$idEdicao} \r\n");
        fwrite($fp, "        \"; \r\n");

        fwrite($fp, "    \r\n");
        fwrite($fp, "    \$pg = new Paginacao; \r\n");
        fwrite($fp, "    \$paginaAtual = (empty(\$_GET['pg'])) ? 1 : intval(\$_GET['pg']); \r\n");
        fwrite($fp, "    \$pg->setUrl('{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php');\r\n");
        fwrite($fp, "    \$pg->setDiv('divConteudo'); \r\n");
        fwrite($fp, "    \$pg->setPaginaAtual(\$paginaAtual); \r\n");
        fwrite($fp, "    \$pg->setSql(\$sql); \r\n");
        //fwrite($fp, "    \$pg->setTabela('{$this->modulo}.{$this->tabela}'); \r\n");
        fwrite($fp, "    \$smarty->assign('paginacao', \$pg->getMontaPaginacao()); \r\n");
        fwrite($fp, "    \$inicial = \$pg->getPesquisaInicial(); \r\n");
        fwrite($fp, "    \r\n");

        fwrite($fp, "    if (\$_GET['excel'] != 'sim') { \r\n");
        fwrite($fp, "        \$clausulaExcel = \" LIMIT 20 OFFSET {\$inicial} \"; \r\n");
        fwrite($fp, "    } \r\n");

        fwrite($fp, "    \$sql .= \$clausulaExcel; \r\n");
        fwrite($fp, "    \$consulta = \$pdo->prepare(\$sql); \r\n");
        fwrite($fp, "    \$consulta->execute(); \r\n");
        fwrite($fp, "    \$dados = \$consulta->fetchAll(PDO::FETCH_ASSOC); \r\n");

        fwrite($fp, "    \r\n");
        fwrite($fp, "    \$smarty->assign('dados', \$dados);\r\n");
        fwrite($fp, "    \r\n");

        fwrite($fp, "    \r\n");
        fwrite($fp, "    \$pdo = NULL; \r\n");
        fwrite($fp, "} catch (PDOException \$e) { \r\n");
        fwrite($fp, "    new Excecao(\$e); \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");

//    $titulos[] = '';
        fwrite($fp, "if (\$_GET['excel'] == 'sim') { \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "    \$excelObj = new GeraXls('exportacao_{$this->modulo}_{$this->tabela}_'.date('d-m-Y_H-i-s')); \r\n");
        fwrite($fp, "    \$excelObj->geraXls(\$dados, true); \r\n");
        fwrite($fp, "} else { \r\n");
        fwrite($fp, "    \$smarty->display('listagem_{$this->modulo}_{$this->tabela}.tpl');\r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    private function criaArquivoListagemTpl() {
        @unlink("{$this->diretorioTpl}/listagem_{$this->modulo}_{$this->tabela}.tpl");

        $fp = fopen("{$this->diretorioTpl}/listagem_{$this->modulo}_{$this->tabela}.tpl", "a");
        fwrite($fp, "<div id='divTitulo'>\r\n");
        fwrite($fp, "    <div style='width: 250px; float: left;'>&nbsp;</div>\r\n");
        fwrite($fp, "    <div style='float: none;'>\r\n");
        fwrite($fp, "        LISTAGEM " . strtoupper($this->tabela) . " \r\n");
        fwrite($fp, "    </div>\r\n");
        fwrite($fp, "    <div style='width: 250px; float: right;'>\r\n");
        fwrite($fp, "        <div class='floatRight'>\r\n");
        fwrite($fp, "            <input class='botaoBusca width150' type='button' title='Novo Cadastro' value='Novo Cadastro' onclick=\"CriaPopup('{$this->modulo}/cadastro_{$this->modulo}_{$this->tabela}.php?pg={\$smarty.get.pg}');\" >\r\n");
        fwrite($fp, "            <input class='botaoBusca width150' type='button' title='Exportar' value='Exportar' onclick=\"Redirect('{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php?excel=sim');\" >\r\n");
        fwrite($fp, "        </div>\r\n");
        fwrite($fp, "    </div>\r\n");
        fwrite($fp, "</div>\r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "<div class='divFormulario'>\r\n");
        fwrite($fp, "    \r\n");
        fwrite($fp, "    <table class='tabelaConsulta width1000px'>\r\n");
        fwrite($fp, "        <tr>\r\n");
        foreach ($this->colunas as $key => $value) {
            if ($value['primary_key'] == 'sim') {
        fwrite($fp, "            <td class='TbTitulo' title='ID {$this->tabela}'>\r\n");
        fwrite($fp, "                # \r\n");
            } else {
        fwrite($fp, "            <td class='TbTitulo'>\r\n");
        fwrite($fp, "                " . ucfirst($value['nome_coluna']) . " \r\n");
            }
        fwrite($fp, "            </td>\r\n");
        }
        fwrite($fp, "            <td class='TbTitulo'>\r\n");
        fwrite($fp, "                Ações \r\n");
        fwrite($fp, "            </td>\r\n");
        fwrite($fp, "        </tr>\r\n");
        fwrite($fp, "        {foreach from=\$dados key=k item=value} \r\n");
        fwrite($fp, "            <tr>\r\n");
        foreach ($this->colunas as $key => $value) {
        fwrite($fp, "                <td class='TbListagem center'>\r\n");
            if ($value['tipo_input'] == 'checkbox') {
        fwrite($fp, "                    <input type='checkbox' name='{$value['nome_coluna']}' id='{\$value.id_{$this->tabela}}' onclick=\"AtivoPadrao(this,'{$this->modulo}.{$this->tabela}','{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php?pg={\$smarty.get.pg}','divConteudo');\" {if \$value.{$value['nome_coluna']} eq '1'}checked{/if} />\r\n");
            } else {
        fwrite($fp, "                    {\$value.{$value['nome_coluna']}} \r\n");
            }
        fwrite($fp, "                </td>\r\n");
        }
        fwrite($fp, "                <td class='TbListagem center' style='text-align:center'>\r\n");
        fwrite($fp, "                    <input type='button' class='btnVisualizar' title='Visualizar' id='Visualizar{\$value.id_{$this->tabela}}' onclick=\"CriaPopup('{$this->modulo}/visualizar_{$this->modulo}_{$this->tabela}.php?id_{$this->tabela}={\$value.id_{$this->tabela}}')\" />\r\n");
        fwrite($fp, "                    <input type='button' class='btnEditar' title='Editar' id='Editar{\$value.id_{$this->tabela}}' onclick=\"CriaPopup('{$this->modulo}/cadastro_{$this->modulo}_{$this->tabela}.php?pg={\$smarty.get.pg}&id_{$this->tabela}={\$value.id_{$this->tabela}}')\" />\r\n");
        fwrite($fp, "                    <input type='button' class='btnExcluir' title='Excluir' id='Excluir{\$value.id_{$this->tabela}}' onclick=\"ExcluirPadrao(this,'{$this->modulo}.{$this->tabela}','{\$value.id_{$this->tabela}}','{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php','divConteudo');\" />\r\n");
        fwrite($fp, "                    <span id='AguardandoExcluir{\$value.id_{$this->tabela}}'></span>\r\n");
        fwrite($fp, "                </td>\r\n");
        fwrite($fp, "            </tr>\r\n");
        fwrite($fp, "        {foreachelse} \r\n");
        fwrite($fp, "            <tr>\r\n");
        fwrite($fp, "                <td class='TbListagem center' colspan='" . (count($this->colunas) + 1) . "' style='text-align:center'><i>Não foram encontrados registros.</i></td>\r\n");
        fwrite($fp, "            </tr>\r\n");
        fwrite($fp, "        {/foreach} \r\n");
        fwrite($fp, "    </table>\r\n");
        fwrite($fp, "    \r\n");
        fwrite($fp, "    <div class='floatRight'>\r\n");
        fwrite($fp, "        {\$paginacao} \r\n");
        fwrite($fp, "    </div>\r\n");
        fwrite($fp, "    \r\n");
        fwrite($fp, "    \r\n");
        fwrite($fp, "</div>\r\n");

        fclose($fp);
    }

    private function criaArquivoCadastroPhp() {
        @unlink("{$this->diretorioPhp}/cadastro_{$this->modulo}_{$this->tabela}.php");

        $fp = fopen("{$this->diretorioPhp}/cadastro_{$this->modulo}_{$this->tabela}.php", "a");
        fwrite($fp, "<?php\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Arquivo gerado automaticamente pela classe Class.CriaDO_arquivos.php\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");
        fwrite($fp, " */\r\n");

        fwrite($fp, "function __autoload(\$classe) { \r\n");
        fwrite($fp, "    \$pastas = array('classes', '../classes', '../classes/do'); \r\n");
        fwrite($fp, "    foreach (\$pastas as \$pasta) { \r\n");
        fwrite($fp, "        if (file_exists(\"{\$pasta}/Class.{\$classe}.php\")) \r\n");
        fwrite($fp, "            include_once \"{\$pasta}/Class.{\$classe}.php\"; \r\n");
        fwrite($fp, "    } \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$sessao = new Sessao(); \r\n");
        fwrite($fp, "if (!\$sessao->verificaSessao()) { \r\n");
        fwrite($fp, "    echo 'session_erro'; \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "}\r\n");
        fwrite($fp, "include_once 'configuracao.php'; \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$permissao = new Permissao(); \r\n");
        fwrite($fp, "\$permissao->setIdUsuario(\$sessao->getValor('sessao_id_usuario')); \r\n");
        fwrite($fp, "\$permissao->verifica('{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php'); \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "if (!\$permissao->getPermissao()) { \r\n");
        fwrite($fp, "    header('Location: ../erro.php?erro=permissao'); \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "//trata informaçoes vindas por \$_GET \r\n");
        fwrite($fp, "\$id_{$this->tabela} = (empty(\$_GET['id_{$this->tabela}'])) ? null : intval(\$_GET['id_{$this->tabela}']); \r\n");
        fwrite($fp, "\$paginaAtual = (empty(\$_GET['pg'])) ? 1 : intval(\$_GET['pg']); \r\n");
        fwrite($fp, "if (\$id_{$this->tabela}) { \r\n");
        fwrite($fp, "    try { \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$pdo = Conexao::open('sistema'); \r\n");
        fwrite($fp, "        \$idEdicao = \$sessao->getValor('sessao_id_edicao'); \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$sql = \" \r\n");
        fwrite($fp, "            SELECT \r\n");
        
        foreach ($this->colunas as $key => $value) {
            $virgula = ($key != array_pop(array_keys($this->colunas))) ? "," : "";

            if($value['data_type'] == 'date' || $value['data_type'] == 'timestamp without time zone' || $value['data_type'] == 'timestamp with time zone') {
        fwrite($fp, "                TO_CHAR({$this->tabela}.{$value['nome_coluna']}, 'dd/mm/yyyy') AS {$value['nome_coluna']}{$virgula} \r\n");
            } else {
        fwrite($fp, "                {$this->tabela}.{$value['nome_coluna']}{$virgula} \r\n");
            }
        }
        fwrite($fp, "            FROM {$this->modulo}.{$this->tabela} \r\n");
        fwrite($fp, "            WHERE {$this->tabela}.id_{$this->tabela} = \$id_{$this->tabela} \r\n");
        if ($this->condicaoIdEdicao) {
        fwrite($fp, "                AND {$this->tabela}.id_edicao = {\$idEdicao} \r\n");
        }
        fwrite($fp, "            \"; \r\n");
        fwrite($fp, "        \$consulta = \$pdo->prepare(\$sql); \r\n");
        fwrite($fp, "        \$consulta->execute(); \r\n");
        fwrite($fp, "        \$dados = \$consulta->fetch(PDO::FETCH_ASSOC); \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$pdo = NULL; \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "    } catch ( PDOException \$e ) { \r\n");
        fwrite($fp, "        new Excecao(\$e); \r\n");
        fwrite($fp, "    } \r\n");
        fwrite($fp, "    \$eventoBotaoCadastrar = \"EditarPadrao(this,'{$this->modulo}.{$this->tabela}',{\$dados['id_{$this->tabela}']},'{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php?pg={\$paginaAtual}','divConteudo'); \"; \r\n");
        fwrite($fp, "} else { \r\n");
        fwrite($fp, "    \$eventoBotaoCadastrar = \"InserirPadrao(this,'{$this->modulo}.{$this->tabela}','{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php?pg={\$paginaAtual}','divConteudo')\"; \r\n");
        fwrite($fp, "}\r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$smarty->assign('dados', \$dados);\r\n");
        fwrite($fp, "\$smarty->assign('eventoBotaoCadastrar', \$eventoBotaoCadastrar); \r\n");
        fwrite($fp, "\$smarty->display('cadastro_{$this->modulo}_{$this->tabela}.tpl'); \r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    private function criaArquivoCadastroTpl() {
        @unlink("{$this->diretorioTpl}/cadastro_{$this->modulo}_{$this->tabela}.tpl");

        $fp = fopen("{$this->diretorioTpl}/cadastro_{$this->modulo}_{$this->tabela}.tpl", "a");

        fwrite($fp, "<div id='divTitulo'>\r\n");
        fwrite($fp, "    CADASTRO " . strtoupper($this->tabela) . " \r\n");
        fwrite($fp, "</div>\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "<div class='divFormulario'>\r\n");
        fwrite($fp, "    <form id='{$this->modulo}.{$this->tabela}' name='{$this->modulo}.{$this->tabela}' lingua_form='{\$smarty.session.sessao_linguagem_sigla}'>\r\n");
        fwrite($fp, "        <input type='hidden' id='id_{$this->tabela}' name='id_{$this->tabela}' value='{\$smarty.get.id_{$this->tabela}}' />\r\n");
          
            
        fwrite($fp, "<fieldset class='marginTop10px'>\r\n");
        fwrite($fp, "<legend class='Negrito'>Dados ".strtoupper($this->tabela)."</legend>\r\n");
        
        foreach ($this->colunas as $key => $value) {
            if ($value['foreign_key'] == 'sim' && $value['nome_coluna'] == 'id_edicao') {
        fwrite($fp, "        <input type='hidden' id='{$value['nome_coluna']}' name='{$value['nome_coluna']}' value='{\$smarty.session.sessao_id_edicao}' />\r\n");
            }
        }
        fwrite($fp, "        <table class='tabelaPopUp'>\r\n");
        foreach ($this->colunas as $key => $value) {
            if ($value['primary_key'] != 'sim' && $value['nome_coluna'] != 'id_edicao') {
        fwrite($fp, "            <tr>\r\n");
        fwrite($fp, "                <td class='textAlignRight' style='width: 180px;'>\r\n");
        fwrite($fp, "                    " . ucfirst($value['nome_coluna']) . ": \r\n");
        fwrite($fp, "                </td>\r\n");
        fwrite($fp, "                <td class='textAlignLeft' style='padding-left: 5px'>\r\n");
                if ($value['tipo_input'] == 'checkbox')
        fwrite($fp, "                    <input type='{$value['tipo_input']}' id='{$value['nome_coluna']}' name='{$value['nome_coluna']}' {if \$dados.{$value['nome_coluna']} eq '1'}checked{/if} />\r\n");
                else
        fwrite($fp, "                    <input type='{$value['tipo_input']}' id='{$value['nome_coluna']}' name='{$value['nome_coluna']}' value='{\$dados.{$value['nome_coluna']}}' class='inputBusca width200' valida='sim,{$value['mascara']}," . ucfirst($value['nome_coluna']) . "' />\r\n");
        fwrite($fp, "                </td>\r\n");
        fwrite($fp, "            </tr>\r\n");
            }
        }
        fwrite($fp, "            <tr>\r\n");
        fwrite($fp, "                <td class='textAlignCenter' colspan='2'>\r\n");
        fwrite($fp, "                    <input type='button' class='botaoBusca' id='cadastrar' name='cadastrar' value='Cadastrar' onclick=\"{\$eventoBotaoCadastrar}\"><br/>\r\n");
        fwrite($fp, "                    <span id='aguardando'></span>\r\n");
        fwrite($fp, "                </td>\r\n");
        fwrite($fp, "            </tr>\r\n");
        fwrite($fp, "        </table>\r\n");
        fwrite($fp, "        </fieldset>\r\n");
        fwrite($fp, "    </form>\r\n");
        fwrite($fp, "    \r\n");
        fwrite($fp, "</div>\r\n");

        fclose($fp);
    }

    private function criaArquivoVisualizarPhp() {
        @unlink("{$this->diretorioPhp}/visualizar_{$this->modulo}_{$this->tabela}.php");

        $fp = fopen("{$this->diretorioPhp}/visualizar_{$this->modulo}_{$this->tabela}.php", "a");
        fwrite($fp, "<?php\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Arquivo gerado automaticamente pela classe Class.CriaDO_arquivos.php\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");
        fwrite($fp, " */\r\n");

        fwrite($fp, "function __autoload(\$classe) { \r\n");
        fwrite($fp, "    \$pastas = array('classes', '../classes', '../classes/do'); \r\n");
        fwrite($fp, "    foreach (\$pastas as \$pasta) { \r\n");
        fwrite($fp, "        if (file_exists(\"{\$pasta}/Class.{\$classe}.php\")) \r\n");
        fwrite($fp, "            include_once \"{\$pasta}/Class.{\$classe}.php\"; \r\n");
        fwrite($fp, "    } \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$sessao = new Sessao(); \r\n");
        fwrite($fp, "if (!\$sessao->verificaSessao()) { \r\n");
        fwrite($fp, "    echo 'session_erro'; \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "}\r\n");
        fwrite($fp, "include_once 'configuracao.php'; \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$permissao = new Permissao(); \r\n");
        fwrite($fp, "\$permissao->setIdUsuario(\$sessao->getValor('sessao_id_usuario')); \r\n");
        fwrite($fp, "\$permissao->verifica('{$this->modulo}/listagem_{$this->modulo}_{$this->tabela}.php'); \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "if (!\$permissao->getPermissao()) { \r\n");
        fwrite($fp, "    header('Location: ../erro.php?erro=permissao'); \r\n");
        fwrite($fp, "    exit(); \r\n");
        fwrite($fp, "} \r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$id_{$this->tabela} = (empty(\$_GET['id_{$this->tabela}'])) ? null : intval(\$_GET['id_{$this->tabela}']); \r\n");
        fwrite($fp, "if (\$id_{$this->tabela}) { \r\n");
        fwrite($fp, "    try { \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$pdo = Conexao::open('sistema'); \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$sql = \"SELECT * FROM {$this->modulo}.{$this->tabela} WHERE id_{$this->tabela} = {\$id_{$this->tabela}} \"; \r\n");
        fwrite($fp, "        \$consulta = \$pdo->prepare(\$sql); \r\n");
        fwrite($fp, "        \$consulta->execute(); \r\n");
        fwrite($fp, "        \$dados = \$consulta->fetch(PDO::FETCH_ASSOC); \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "        \$pdo = NULL; \r\n");
        fwrite($fp, "        \r\n");
        fwrite($fp, "    } catch ( PDOException \$e ) { \r\n");
        fwrite($fp, "        new Excecao(\$e); \r\n");
        fwrite($fp, "    } \r\n");
        fwrite($fp, "}\r\n");
        fwrite($fp, "\r\n");
        fwrite($fp, "\$smarty->assign('dados', \$dados);\r\n");
        fwrite($fp, "\$smarty->display('visualizar_{$this->modulo}_{$this->tabela}.tpl'); \r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    public function criaArquivoVisualizarTpl() {

        @unlink("{$this->diretorioTpl}/visualizar_{$this->modulo}_{$this->tabela}.tpl");

        $fp = fopen("{$this->diretorioTpl}/visualizar_{$this->modulo}_{$this->tabela}.tpl", "a");

        fwrite($fp, "<div id='divTitulo'>\r\n");
        fwrite($fp, "    VISUALIZAR " . strtoupper($this->tabela) . " \r\n");
        fwrite($fp, "</div>\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "<div id='divSubTitulo'>\r\n");
        fwrite($fp, "    Visualização de " . ucfirst($this->tabela) . " \r\n");
        fwrite($fp, "</div>\r\n");

        fwrite($fp, "\r\n");
        fwrite($fp, "<div class='divFormulario'>\r\n");
        fwrite($fp, "    <table  style='margin: 0 auto'>\r\n");
        foreach ($this->colunas as $key => $value) {
            if ($value['primary_key'] != 'sim') {
        fwrite($fp, "        <tr>\r\n");
        fwrite($fp, "            <td class='Right Negrito'>\r\n");
        fwrite($fp, "                " . ucfirst($value['nome_coluna']) . ": \r\n");
        fwrite($fp, "            </td>\r\n");
        fwrite($fp, "            <td class='Left paddingLeft10px'>\r\n");
                if ($value['tipo_input'] == 'checkbox')
        fwrite($fp, "                {if \$dados.{$value['nome_coluna']} eq '1'}Sim{else}Não{/if} \r\n");
                else
        fwrite($fp, "                {\$dados.{$value['nome_coluna']}} \r\n");
        fwrite($fp, "            </td>\r\n");
        fwrite($fp, "        </tr>\r\n");
            }
        }
        fwrite($fp, "    </table>\r\n");
        fwrite($fp, "</div>\r\n");

        fclose($fp);
    }

    private function criaDTO() {
        @unlink("{$this->diretorioDao}/Class.{$this->nomeClasse}DTO.php");

        $fp = fopen("{$this->diretorioDao}/Class.{$this->nomeClasse}DTO.php", "a");
        fwrite($fp, "<?php\r\n");

        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Classe DTO para a tabela {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Data Transfer Object (DTO) - Utilizado apenas como estrutura para transporte de dados\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Contém a mesma estrutura da tabela, os campos da tabela com os seus Get's e Set's\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Versão: {$this->versao}\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");
        fwrite($fp, " * Modificado Por:\r\n");
        fwrite($fp, " * Data Modificação:\r\n");
        fwrite($fp, " */\r\n");
        fwrite($fp, "class {$this->nomeClasse}DTO\r\n");
        fwrite($fp, "{\r\n");

        fwrite($fp, "    // Define as propriedades\r\n");

        foreach ($this->colunas as $linha) {
            $nomePropriedade = $this->getNomePropriedade($linha['nome_coluna']);
            fwrite($fp, "    private \${$nomePropriedade} = false;\r\n");
        }

        fwrite($fp, "\r\n");

        foreach ($this->colunas as $linha) {

            $nomePropriedade = $this->getNomePropriedade($linha['nome_coluna']);
            $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);

            // ************************** METODO *******************************
            fwrite($fp, "    /**\r\n");
            fwrite($fp, "     * Seta um valor à propriedade {$nomePropriedade}\r\n");
            fwrite($fp, "     * @access public\r\n");
            fwrite($fp, "     * @param \${$linha['udt_name']} {$nomePropriedade}\r\n");
            fwrite($fp, "     */\r\n");
            fwrite($fp, "    public function set{$nomeMetodo}(\${$nomePropriedade})\r\n");
            fwrite($fp, "    {\r\n");
            switch ($linha['udt_name']) {
                case 'int4' :
                    if ((isset($linha['primary_key']) || isset($linha['foreign_key'])) && ($linha['nulo'] == 'nao'))
                        fwrite($fp, "        \$this->{$nomePropriedade} = intval(\${$nomePropriedade});\r\n");
                    else {
                        if (isset($linha['primary_key']) || isset($linha['foreign_key']))
                            fwrite($fp, "        \$this->{$nomePropriedade} = empty(\${$nomePropriedade}) ? '' : intval(\${$nomePropriedade});\r\n");
                        else
                            fwrite($fp, "        \$this->{$nomePropriedade} = strlen(\${$nomePropriedade}) > 0 ? intval(\${$nomePropriedade}) : '';\r\n");
                    }
                    break;
                case 'numeric' :
                    fwrite($fp, "        \$this->{$nomePropriedade} = strlen(\${$nomePropriedade}) > 0 ? floatval(\${$nomePropriedade}) : '';\r\n");
                    break;
                case 'varchar' :
                    fwrite($fp, "        \$this->{$nomePropriedade} = strlen(\${$nomePropriedade}) > 0 ? substr(\${$nomePropriedade},0,{$linha['character_maximum_length']}) : '';\r\n");
                    break;
                case 'timestamp' :
                    fwrite($fp, "        \$this->{$nomePropriedade} = empty(\${$nomePropriedade}) ? date('Y-m-d H:i:s') : \${$nomePropriedade};\r\n");
                    break;
                case 'bool' :
                    fwrite($fp, "        \$this->{$nomePropriedade} = \${$nomePropriedade};\r\n");
                    break;
                default :
                    fwrite($fp, "        \$this->{$nomePropriedade} = strlen(\${$nomePropriedade}) > 0 ? \${$nomePropriedade} : '';\r\n");
                    break;
            }
            fwrite($fp, "    }\r\n\r\n");

            // ************************** METODO *******************************
            fwrite($fp, "    /**\r\n");
            fwrite($fp, "     * Retorna o valor da propriedade {$nomePropriedade}\r\n");
            fwrite($fp, "     * @access public\r\n");
            fwrite($fp, "     * @return {$linha['udt_name']}\r\n");
            fwrite($fp, "     */\r\n");
            fwrite($fp, "    public function get{$nomeMetodo}()\r\n");
            fwrite($fp, "    {\r\n");
            fwrite($fp, "        return \$this->{$nomePropriedade};\r\n");
            fwrite($fp, "    }\r\n\r\n");
        }

        fwrite($fp, "}\r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    private function criaDAO() {
        @unlink("{$this->diretorioDao}/Class.{$this->nomeClasse}DAO.php");

        $fp = fopen("{$this->diretorioDao}/Class.{$this->nomeClasse}DAO.php", "a");
        fwrite($fp, "<?php\r\n");

        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Classe DAO para a tabela {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Data Access Object (DAO) - Responsavel em fazer operações básicas na tabela como: Inserir, Editar e Excluir\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Versão: {$this->versao}\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");
        fwrite($fp, " * Modificado Por:\r\n");
        fwrite($fp, " * Data Modificação:\r\n");
        fwrite($fp, " */\r\n");
        fwrite($fp, "class {$this->nomeClasse}DAO\r\n");
        fwrite($fp, "{\r\n");

        fwrite($fp, "    // Define as propriedades\r\n");
        fwrite($fp, "    private \$pdo;\r\n");
        fwrite($fp, "    private \$sql;\r\n");
        fwrite($fp, "    private \$idTipoAcao;\r\n");
        fwrite($fp, "    private \$nota;\r\n");
        fwrite($fp, "    private \$criaHistorico;\r\n\r\n");

        // ************************** METODO *******************************
        // cria metodo construtor
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Construtor\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function __construct(\$pdo, \$historico = true)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        \$this->pdo = \$pdo;\r\n");
        fwrite($fp, "        \$this->criaHistorico = \$historico;\r\n");
        fwrite($fp, "    }\r\n\r\n");

        // ************************** METODO *******************************
        // cria metodo para retornar o sql
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Retorna o valor da propriedade sql\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function getSql()\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        return \$this->sql;\r\n");
        fwrite($fp, "    }\r\n\r\n");

        // ************************** METODO *******************************
        // cria metodo para inserir
        $this->daoInserir($fp);

        // ************************** METODO *******************************
        // cria metodo para editar
        if ($this->chavePrimaria)
            $this->daoEditarId($fp);
        else
            $this->daoEditar($fp);

        // ************************** METODO *******************************
        // cria metodo para excluir
        if ($this->chavePrimaria)
            $this->daoExcluirId($fp);
        else
            $this->daoExcluir($fp);

        // ************************** METODO *******************************
        // cria metodo para listar
        $this->daoListar($fp);

        // ************************** METODO *******************************
        // cria metodo para criar nota
        //$this->daoCriaNota($fp);
        // ************************** METODO *******************************
        // cria metodo para historico
        if ($this->chavePrimaria)
            $this->daoHistoricoId($fp);
        else
            $this->daoHistorico($fp);

        fwrite($fp, "}\r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    private function daoInserir($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em inserir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param objeto \${$this->tabelaPropriedade}DTO Objeto DTO contendo informações a serem inseridas\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function inserir({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Define a propriedade idTipoAcao como Inserir\r\n");
        fwrite($fp, "        \$this->idTipoAcao = 1;\r\n");
        fwrite($fp, "        // Define a nota para a ação\r\n");
        fwrite($fp, "        \$this->nota = 'Cadastro inserido';\r\n");
        fwrite($fp, "        // Instancia classe SqlInserir\r\n");
        fwrite($fp, "        \$sql = new SqlInserir;\r\n");
        fwrite($fp, "        // Seta a tabela\r\n");
        fwrite($fp, "        \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "        // Seta o(s) campo(s)\r\n");
        $i = 0;
        foreach ($this->colunas as $linha) {
            $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
            if ($this->chavePrimaria) {
                if ($i != 0) {
                    fwrite($fp, "        if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== false )\r\n");
                    fwrite($fp, "        {\r\n");
                    fwrite($fp, "            \$sql->setCampo('{$linha['nome_coluna']}', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                    fwrite($fp, "        }\r\n");
                }
            } else {
                fwrite($fp, "        if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== false )\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            \$sql->setCampo('{$linha['nome_coluna']}', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                fwrite($fp, "        }\r\n");
            }
            $i++;
        }
        fwrite($fp, "        // Prepara sql\r\n");
        fwrite($fp, "        \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "        // Executa sql\r\n");
        fwrite($fp, "        \$consulta->execute();\r\n");
        if ($this->chavePrimaria) {
            fwrite($fp, "        // Seta o ultimo id inserido a propriedade id{$this->tabelaMetodo}\r\n");
            fwrite($fp, "        \${$this->tabelaPropriedade}DTO->setId{$this->tabelaMetodo}(\$this->pdo->lastInsertId('{$this->modulo}.{$this->tabela}_id_{$this->tabela}_seq'));\r\n");
        }
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \$sql->getInstrucao();\r\n");
        fwrite($fp, "        // Inseri o historico\r\n");
        fwrite($fp, "        if ( \$this->criaHistorico )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            \$this->historico(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoEditarId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em editar\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param objeto \${$this->tabelaPropriedade}DTO Objeto DTO contendo informações a serem editadas\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function editar({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Define criterio para executar busca\r\n");
        fwrite($fp, "        \$criterioListar = array();\r\n");
        $nomeMetodo = $this->getNomeMetodo("id_{$this->tabela}");
        fwrite($fp, "        \$criterioListar []= array('id_{$this->tabela}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
        fwrite($fp, "        // Executa a busca\r\n");
        fwrite($fp, "        \$consulta = \$this->listar(null, \$criterioListar);\r\n");
        fwrite($fp, "        // Verifica se a busca retornou o registro\r\n");
        fwrite($fp, "        if ( \$consulta->rowCount() == 1 )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            // Define a propriedade idTipoAcao como Editar\r\n");
        fwrite($fp, "            \$this->idTipoAcao = 2;\r\n");
        fwrite($fp, "            // Instancia classe SqlEditar\r\n");
        fwrite($fp, "            \$sql = new SqlEditar;\r\n");
        fwrite($fp, "            // Seta a tabela\r\n");
        fwrite($fp, "            \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "            // Passa resultado da consulta a variavel \$linha\r\n");
        fwrite($fp, "            \$linha = \$consulta->fetch(PDO::FETCH_ASSOC);\r\n");
        fwrite($fp, "            \$this->nota = '';\r\n");
        fwrite($fp, "            // Faz verificação sobre cada campo da tabela para setar na consulta e criar nota\r\n");
        $i = 0;
        foreach ($this->colunas as $linha) {
            if ($i != 0) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "            if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== false )\r\n");
                fwrite($fp, "            {\r\n");
                if ($linha['udt_name'] == 'bool')
                    fwrite($fp, "                if ( \$linha['{$linha['nome_coluna']}'] !== \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() )\r\n");
                else
                    fwrite($fp, "                if ( \$linha['{$linha['nome_coluna']}'] != \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() )\r\n");

                fwrite($fp, "                {\r\n");

                if (isset($linha['esquema_ref'])) {
                    $tabelaRefMetodo = $this->getNomeMetodo($linha['tabela_ref']);
                    $tabelaRefPropriedade = $this->getNomePropriedade($linha['tabela_ref']);

                    $tabelaRefEmPartes = explode("_", $linha['tabela_ref']);
                    $nomeClasseRef = str_replace(' ', '', ucwords($linha['esquema_ref'] . ' ' . implode(" ", $tabelaRefEmPartes)));
                    fwrite($fp, "                    // Instancia Classe {$nomeClasseRef}Executa \r\n");
                    fwrite($fp, "                    \${$tabelaRefPropriedade} = new {$nomeClasseRef}Executa(\$this->pdo);\r\n");
                    fwrite($fp, "                    // Define campo para busca\r\n");
                    fwrite($fp, "                    \$campo{$tabelaRefMetodo} = array('{$linha['nome_coluna_ref']}');\r\n");
                    fwrite($fp, "                    // Define criterio para busca valor antigo\r\n");
                    fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Antigo = array();\r\n");
                    fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Antigo []= array('id_{$linha['tabela_ref']}', '=', \$linha['{$linha['nome_coluna']}']);\r\n");
                    fwrite($fp, "                    // Executa a busca\r\n");
                    fwrite($fp, "                    \$consultaAntigo = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Antigo);\r\n");
                    fwrite($fp, "                    \$linhaAntigo = \$consultaAntigo->fetch(PDO::FETCH_ASSOC);\r\n");
                    if ($linha['nulo'] == 'nao') {
                        fwrite($fp, "                    // Define criterio para busca valor atual\r\n");
                        fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Atual = array();\r\n");
                        fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Atual []= array('id_{$linha['tabela_ref']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                        fwrite($fp, "                    \$consultaAtual = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Atual);\r\n");
                        fwrite($fp, "                    \$linhaAtual = \$consultaAtual->fetch(PDO::FETCH_ASSOC);\r\n");
                    } else {
                        fwrite($fp, "                    if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== '' )\r\n");
                        fwrite($fp, "                    {\r\n");
                        fwrite($fp, "                        // Define criterio para busca valor atual\r\n");
                        fwrite($fp, "                        \$criterio{$tabelaRefMetodo}Atual = array();\r\n");
                        fwrite($fp, "                        \$criterio{$tabelaRefMetodo}Atual []= array('id_{$linha['tabela_ref']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                        fwrite($fp, "                        \$consultaAtual = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Atual);\r\n");
                        fwrite($fp, "                        \$linhaAtual = \$consultaAtual->fetch(PDO::FETCH_ASSOC);\r\n");
                        fwrite($fp, "                    }\r\n");
                        fwrite($fp, "                    else\r\n");
                        fwrite($fp, "                    {\r\n");
                        fwrite($fp, "                        \$linhaAtual['{$linha['nome_coluna_ref']}'] = '';\r\n");
                        fwrite($fp, "                    }\r\n");
                    }

                    fwrite($fp, "                    \$this->nota .= empty(\$this->nota) ? '' : \"\\r\\n|><|<->|><|\";\r\n");
                    fwrite($fp, "                    \$this->nota .= \"{$linha['nome_coluna']}|><|<>|><|{\$linhaAntigo['{$linha['nome_coluna_ref']}']}|><|<>|><|{\$linhaAtual['{$linha['nome_coluna_ref']}']}\";\r\n");
                } else {
                    fwrite($fp, "                    \$this->nota .= empty(\$this->nota) ? '' : \"\\r\\n|><|<->|><|\";\r\n");
                    fwrite($fp, "                    \$this->nota .= \"{$linha['nome_coluna']}|><|<>|><|{\$linha['{$linha['nome_coluna']}']}|><|<>|><|{\${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()}\";\r\n");
                }

                fwrite($fp, "                    \$sql->setCampo('{$linha['nome_coluna']}', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                fwrite($fp, "                }\r\n");
                fwrite($fp, "            }\r\n");
            }
            $i++;
        }

        fwrite($fp, "            // Verifica se deve editar ou nao\r\n");
        fwrite($fp, "            if ( !empty(\$this->nota) )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                // Instancia classe SqlCriterio\r\n");
        fwrite($fp, "                \$criterio = new SqlCriterio;\r\n");
        fwrite($fp, "                // Define criterio de edição\r\n");
        $nomeMetodo = $this->getNomeMetodo("id_{$this->tabela}");
        fwrite($fp, "                \$criterio->add(new SqlFiltro('id_{$this->tabela}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()));\r\n");
        fwrite($fp, "                \$sql->setCriterio(\$criterio);\r\n");
        fwrite($fp, "                // Prepara sql\r\n");
        fwrite($fp, "                \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "                // Executa sql\r\n");
        fwrite($fp, "                \$consulta->execute();\r\n");
        fwrite($fp, "                // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "                \$this->sql = \$sql->getInstrucao();\r\n");
        fwrite($fp, "                // Inseri o historico\r\n");
        fwrite($fp, "                if ( \$this->criaHistorico )\r\n");
        fwrite($fp, "                {\r\n");
        fwrite($fp, "                    \$this->historico(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "                }\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoEditar($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em editar\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param objeto \${$this->tabelaPropriedade}DTO Objeto DTO contendo informações a serem editadas\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function editar({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Define criterio para executar busca\r\n");
        fwrite($fp, "        \$criterioListar = array();\r\n");

        foreach ($this->colunas as $linha) {
            if (isset($linha['primary_key'])) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "        \$criterioListar []= array('{$linha['nome_coluna']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
            }
        }

        fwrite($fp, "        // Executa a busca\r\n");
        fwrite($fp, "        \$consulta = \$this->listar(null, \$criterioListar);\r\n");
        fwrite($fp, "        // Verifica se a busca retornou o registro\r\n");
        fwrite($fp, "        if ( \$consulta->rowCount() == 1 )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            // Define a propriedade idTipoAcao como Editar\r\n");
        fwrite($fp, "            \$this->idTipoAcao = 2;\r\n");
        fwrite($fp, "            // Instancia classe SqlEditar\r\n");
        fwrite($fp, "            \$sql = new SqlEditar;\r\n");
        fwrite($fp, "            // Seta a tabela\r\n");
        fwrite($fp, "            \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "            // Passa resultado da consulta a variavel \$linha\r\n");
        fwrite($fp, "            \$linha = \$consulta->fetch(PDO::FETCH_ASSOC);\r\n");
        fwrite($fp, "            \$this->nota = '';\r\n");
        fwrite($fp, "            // Faz verificação sobre cada campo da tabela para setar na consulta e criar nota\r\n");

        foreach ($this->colunas as $linha) {
            if (!isset($linha['primary_key'])) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "            if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== false )\r\n");
                fwrite($fp, "            {\r\n");
                if ($linha['udt_name'] == 'bool')
                    fwrite($fp, "                if ( \$linha['{$linha['nome_coluna']}'] !== \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() )\r\n");
                else
                    fwrite($fp, "                if ( \$linha['{$linha['nome_coluna']}'] != \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() )\r\n");

                fwrite($fp, "                {\r\n");

                if (isset($linha['esquema_ref'])) {
                    $tabelaRefMetodo = $this->getNomeMetodo($linha['tabela_ref']);
                    $tabelaRefPropriedade = $this->getNomePropriedade($linha['tabela_ref']);

                    $tabelaRefEmPartes = explode("_", $linha['tabela_ref']);
                    $nomeClasseRef = str_replace(' ', '', ucwords($linha['esquema_ref'] . ' ' . implode(" ", $tabelaRefEmPartes)));
                    fwrite($fp, "                    // Instancia Classe {$nomeClasseRef}Executa \r\n");
                    fwrite($fp, "                    \${$tabelaRefPropriedade} = new {$nomeClasseRef}Executa(\$this->pdo);\r\n");
                    fwrite($fp, "                    // Define campo para busca\r\n");
                    fwrite($fp, "                    \$campo{$tabelaRefMetodo} = array('{$linha['nome_coluna_ref']}');\r\n");
                    fwrite($fp, "                    // Define criterio para busca valor antigo\r\n");
                    fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Antigo = array();\r\n");
                    fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Antigo []= array('id_{$linha['tabela_ref']}', '=', \$linha['{$linha['nome_coluna']}']);\r\n");
                    fwrite($fp, "                    // Executa a busca\r\n");
                    fwrite($fp, "                    \$consultaAntigo = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Antigo);\r\n");
                    fwrite($fp, "                    \$linhaAntigo = \$consultaAntigo->fetch(PDO::FETCH_ASSOC);\r\n");
                    if ($linha['nulo'] == 'nao') {
                        fwrite($fp, "                    // Define criterio para busca valor atual\r\n");
                        fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Atual = array();\r\n");
                        fwrite($fp, "                    \$criterio{$tabelaRefMetodo}Atual []= array('id_{$linha['tabela_ref']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                        fwrite($fp, "                    \$consultaAtual = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Atual);\r\n");
                        fwrite($fp, "                    \$linhaAtual = \$consultaAtual->fetch(PDO::FETCH_ASSOC);\r\n");
                    } else {
                        fwrite($fp, "                    if ( \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}() !== '' )\r\n");
                        fwrite($fp, "                    {\r\n");
                        fwrite($fp, "                        // Define criterio para busca valor atual\r\n");
                        fwrite($fp, "                        \$criterio{$tabelaRefMetodo}Atual = array();\r\n");
                        fwrite($fp, "                        \$criterio{$tabelaRefMetodo}Atual []= array('id_{$linha['tabela_ref']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                        fwrite($fp, "                        \$consultaAtual = \${$tabelaRefPropriedade}->listar(\$campo{$tabelaRefMetodo}, \$criterio{$tabelaRefMetodo}Atual);\r\n");
                        fwrite($fp, "                        \$linhaAtual = \$consultaAtual->fetch(PDO::FETCH_ASSOC);\r\n");
                        fwrite($fp, "                    }\r\n");
                        fwrite($fp, "                    else\r\n");
                        fwrite($fp, "                    {\r\n");
                        fwrite($fp, "                        \$linhaAtual['{$linha['nome_coluna_ref']}'] = '';\r\n");
                        fwrite($fp, "                    }\r\n");
                    }

                    fwrite($fp, "                    \$this->nota .= empty(\$this->nota) ? '' : \"\\r\\n|><|<->|><|\";\r\n");
                    fwrite($fp, "                    \$this->nota .= \"{$linha['nome_coluna']}|><|<>|><|{\$linhaAntigo['{$linha['nome_coluna_ref']}']}|><|<>|><|{\$linhaAtual['{$linha['nome_coluna_ref']}']}\";\r\n");
                } else {
                    fwrite($fp, "                    \$this->nota .= empty(\$this->nota) ? '' : \"\\r\\n|><|<->|><|\";\r\n");
                    fwrite($fp, "                    \$this->nota .= \"{$linha['nome_coluna']}|><|<>|><|{\$linha['{$linha['nome_coluna']}']}|><|<>|><|{\${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()}\";\r\n");
                }

                fwrite($fp, "                    \$sql->setCampo('{$linha['nome_coluna']}', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}());\r\n");
                fwrite($fp, "                }\r\n");
                fwrite($fp, "            }\r\n");
            }
        }

        fwrite($fp, "            // Verifica se deve editar ou nao\r\n");
        fwrite($fp, "            if ( !empty(\$this->nota) )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                // Instancia classe SqlCriterio\r\n");
        fwrite($fp, "                \$criterio = new SqlCriterio;\r\n");
        fwrite($fp, "                // Define criterio de edição\r\n");
        foreach ($this->colunas as $linha) {
            if (isset($linha['primary_key'])) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "                \$criterio->add(new SqlFiltro('{$linha['nome_coluna']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()));\r\n");
            }
        }
        fwrite($fp, "                \$sql->setCriterio(\$criterio);\r\n");
        fwrite($fp, "                // Prepara sql\r\n");
        fwrite($fp, "                \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "                // Executa sql\r\n");
        fwrite($fp, "                \$consulta->execute();\r\n");
        fwrite($fp, "                // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "                \$this->sql = \$sql->getInstrucao();\r\n");
        fwrite($fp, "                // Inseri o historico\r\n");
        fwrite($fp, "                if ( \$this->criaHistorico )\r\n");
        fwrite($fp, "                {\r\n");
        fwrite($fp, "                    \$this->historico(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "                }\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoExcluirId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em excluir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param objeto \${$this->tabelaPropriedade}DTO Objeto DTO contendo informações a serem editadas\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function excluir({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Define a propriedade idTipoAcao como Excluir\r\n");
        fwrite($fp, "        \$this->idTipoAcao = 3;\r\n");
        fwrite($fp, "        // Define a nota para a ação\r\n");
        fwrite($fp, "        \$this->nota = 'Cadastro excluido';\r\n");
        fwrite($fp, "        // Instancia classe SqlExcluir\r\n");
        fwrite($fp, "        \$sql = new SqlExcluir;\r\n");
        fwrite($fp, "        // Seta a tabela\r\n");
        fwrite($fp, "        \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "        // Instancia classe SqlCriterio\r\n");
        fwrite($fp, "        \$criterio = new SqlCriterio;\r\n");
        fwrite($fp, "        // Define criterio de exclusão\r\n");
        $nomeMetodo = $this->getNomeMetodo("id_{$this->tabela}");
        fwrite($fp, "        \$criterio->add(new SqlFiltro('id_{$this->tabela}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()));\r\n");
        fwrite($fp, "        \$sql->setCriterio(\$criterio);\r\n");
        fwrite($fp, "        // Prepara sql\r\n");
        fwrite($fp, "        \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "        // Executa sql\r\n");
        fwrite($fp, "        \$consulta->execute();\r\n");
        fwrite($fp, "        // Verifica se excluiu o registro\r\n");
        fwrite($fp, "        if ( \$consulta->rowCount() > 0 )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "            \$this->sql = \$sql->getInstrucao();\r\n");
        fwrite($fp, "            // Inseri o historico\r\n");
        fwrite($fp, "            if ( \$this->criaHistorico )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                \$this->historico(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoExcluir($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em excluir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param objeto \${$this->tabelaPropriedade}DTO Objeto DTO contendo informações a serem editadas\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function excluir({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Define a propriedade idTipoAcao como Excluir\r\n");
        fwrite($fp, "        \$this->idTipoAcao = 3;\r\n");
        fwrite($fp, "        // Define a nota para a ação\r\n");
        fwrite($fp, "        \$this->nota = 'Cadastro excluido';\r\n");
        fwrite($fp, "        // Instancia classe SqlExcluir\r\n");
        fwrite($fp, "        \$sql = new SqlExcluir;\r\n");
        fwrite($fp, "        // Seta a tabela\r\n");
        fwrite($fp, "        \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "        // Instancia classe SqlCriterio\r\n");
        fwrite($fp, "        \$criterio = new SqlCriterio;\r\n");
        fwrite($fp, "        // Define criterio de exclusão\r\n");
        foreach ($this->colunas as $linha) {
            if (isset($linha['primary_key'])) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "        \$criterio->add(new SqlFiltro('{$linha['nome_coluna']}', '=', \${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()));\r\n");
            }
        }
        fwrite($fp, "        \$sql->setCriterio(\$criterio);\r\n");
        fwrite($fp, "        // Prepara sql\r\n");
        fwrite($fp, "        \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "        // Executa sql\r\n");
        fwrite($fp, "        \$consulta->execute();\r\n");
        fwrite($fp, "        // Verifica se excluiu o registro\r\n");
        fwrite($fp, "        if ( \$consulta->rowCount() > 0 )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "            \$this->sql = \$sql->getInstrucao();\r\n");
        fwrite($fp, "            // Inseri o historico\r\n");
        fwrite($fp, "            if ( \$this->criaHistorico )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                \$this->historico(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoListar($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em listar\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$campos Array contendo o nome dos campos\r\n");
        fwrite($fp, "     * @param array \$criterios Array contendo o(s) criterio(s) para listagem\r\n");
        fwrite($fp, "     * @param array \$propriedade Array contendo o nome das propriedades \r\n");
        fwrite($fp, "     * @return objeto Retorna o Objeto com o resultado da consulta\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function listar(\$campos = null, \$criterios = null, \$propriedade = null)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe SqlSelect\r\n");
        fwrite($fp, "        \$sql = new SqlSelect;\r\n");
        fwrite($fp, "        // Seta a tabela\r\n");
        fwrite($fp, "        \$sql->setTabela('{$this->modulo}.{$this->tabela}');\r\n");
        fwrite($fp, "        // Seta campos\r\n");
        fwrite($fp, "        if ( \$campos )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            foreach( \$campos AS \$campo )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                \$sql->addColuna(\$campo);\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        else\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            \$sql->addColuna('*');\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        // Instancia classe SqlCriterio\r\n");
        fwrite($fp, "        \$criterio = new SqlCriterio;\r\n");
        fwrite($fp, "        // Seta criterios\r\n");
        fwrite($fp, "        if ( \$criterios )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            foreach( \$criterios AS \$valor )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                \$operador = isset(\$valor[3]) ? \$valor[3] . ' ' : 'AND ';\r\n");
        fwrite($fp, "                \$criterio->add(new SqlFiltro(\$valor[0], \$valor[1], \$valor[2]), \$operador);\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        // Seta propriedades\r\n");
        fwrite($fp, "        if ( \$propriedade )\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            foreach( \$propriedade AS \$valor )\r\n");
        fwrite($fp, "            {\r\n");
        fwrite($fp, "                \$criterio->setPropriedade(\$valor[0], \$valor[1]);\r\n");
        fwrite($fp, "            }\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        // Define criterios e propriedades ao sql\r\n");
        fwrite($fp, "        \$sql->setCriterio(\$criterio);\r\n");
        fwrite($fp, "        // Prepara sql\r\n");
        fwrite($fp, "        \$consulta = \$this->pdo->prepare(\$sql->getInstrucao());\r\n");
        fwrite($fp, "        // Executa sql\r\n");
        fwrite($fp, "        \$consulta->execute();\r\n");
        fwrite($fp, "        // Retorna o Objeto com o resultado da consulta\r\n");
        fwrite($fp, "        return \$consulta;\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoHistoricoId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel inserir historico\r\n");
        fwrite($fp, "     * @access private\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    private function historico({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Cria Array para guardar dados do historico\r\n");
        fwrite($fp, "        \$dadosHistorico = array();\r\n");
        fwrite($fp, "        // Seta valores\r\n");
        fwrite($fp, "        \$dadosHistorico['id_usuario'] = \$_SESSION['sessao_id_usuario'];\r\n");
        fwrite($fp, "        \$dadosHistorico['id_tipo_acao'] = \$this->idTipoAcao;\r\n");
        fwrite($fp, "        \$dadosHistorico['historico'] = \$this->getSql();\r\n");
        fwrite($fp, "        \$dadosHistorico['nome_tabela'] = '{$this->modulo}.{$this->tabela}';\r\n");
        fwrite($fp, "        \$dadosHistorico['id_registro'] = \${$this->tabelaPropriedade}DTO->getId{$this->tabelaMetodo}();\r\n");
        fwrite($fp, "        \$dadosHistorico['nota'] = \$this->nota;\r\n");
        fwrite($fp, "        // Instancia classe HistoricoHistoricoExecuta\r\n");
        fwrite($fp, "        \$historico = new HistoricoHistoricoExecuta(\$this->pdo);\r\n");
        fwrite($fp, "        \$historico->inserir(\$dadosHistorico);\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function daoHistorico($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel inserir historico\r\n");
        fwrite($fp, "     * @access private\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    private function historico({$this->nomeClasse}DTO \${$this->tabelaPropriedade}DTO)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Cria Array para guardar dados do historico\r\n");
        fwrite($fp, "        \$dadosHistorico = array();\r\n");
        fwrite($fp, "        // Seta valores\r\n");
        fwrite($fp, "        \$dadosHistorico['id_usuario'] = \$_SESSION['sessao_id_usuario'];\r\n");
        fwrite($fp, "        \$dadosHistorico['id_tipo_acao'] = \$this->idTipoAcao;\r\n");
        fwrite($fp, "        \$dadosHistorico['historico'] = \$this->getSql();\r\n");
        fwrite($fp, "        \$dadosHistorico['nome_tabela'] = '{$this->modulo}.{$this->tabela}';\r\n");
        fwrite($fp, "        \$id = '';\r\n");
        foreach ($this->colunas as $linha) {
            if (isset($linha['primary_key'])) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "        \$id .= \"{$linha['nome_coluna']}, {\${$this->tabelaPropriedade}DTO->get{$nomeMetodo}()};\";\r\n");
            }
        }

        fwrite($fp, "        \$dadosHistorico['id_chave_estrangeira'] = \$id;\r\n");
        fwrite($fp, "        \$dadosHistorico['nota'] = \$this->nota;\r\n");
        fwrite($fp, "        // Instancia classe HistoricoHistoricoExecuta\r\n");
        fwrite($fp, "        \$historico = new HistoricoHistoricoExecuta(\$this->pdo);\r\n");
        fwrite($fp, "        \$historico->inserir(\$dadosHistorico);\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function criaExcuta() {
        @unlink("{$this->diretorioDao}/Class.{$this->nomeClasse}Executa.php");

        $fp = fopen("{$this->diretorioDao}/Class.{$this->nomeClasse}Executa.php", "a");
        fwrite($fp, "<?php\r\n");
        fwrite($fp, "/**\r\n");
        fwrite($fp, " * Classe responsavel em utilizar Data Access Object para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, " *\r\n");
        fwrite($fp, " * Versão: {$this->versao}\r\n");
        fwrite($fp, " * Criado Por: {$this->criadoPor}\r\n");
        fwrite($fp, " * Data Criação: {$this->dataCriacao}\r\n");
        fwrite($fp, " * Modificado Por:\r\n");
        fwrite($fp, " * Data Modificação:\r\n");
        fwrite($fp, " */\r\n");
        fwrite($fp, "class {$this->nomeClasse}Executa\r\n");
        fwrite($fp, "{\r\n");

        fwrite($fp, "    // Define as propriedades\r\n");
        fwrite($fp, "    private \$pdo;\r\n");
        fwrite($fp, "    private \$criaHistorico;\r\n");
        fwrite($fp, "    private \$sql;\r\n");
        if ($this->chavePrimaria)
            fwrite($fp, "    private \$ultimoId;\r\n");

        fwrite($fp, "\r\n");

        // ************************** METODO *******************************
        // cria metodo construtor
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Construtor\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function __construct(\$pdo, \$historico = true)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        \$this->pdo = \$pdo;\r\n");
        fwrite($fp, "        \$this->criaHistorico = \$historico;\r\n");
        fwrite($fp, "    }\r\n\r\n");

        // ************************** METODO *******************************
        // cria metodo para retornar o sql
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Retorna o valor da propriedade sql\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function getSql()\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        return \$this->sql;\r\n");
        fwrite($fp, "    }\r\n\r\n");

        if ($this->chavePrimaria) {
            // ************************** METODO *******************************
            // cria metodo para retornar o ultimo ID
            fwrite($fp, "    /**\r\n");
            fwrite($fp, "     * Retorna o valor da propriedade ultimoId\r\n");
            fwrite($fp, "     * @access public\r\n");
            fwrite($fp, "     */\r\n");
            fwrite($fp, "    public function getUltimoId()\r\n");
            fwrite($fp, "    {\r\n");
            fwrite($fp, "        return \$this->ultimoId;\r\n");
            fwrite($fp, "    }\r\n\r\n");
        }

        // ************************** METODO *******************************
        // cria metodo para inserir
        if ($this->chavePrimaria)
            $this->executaInserirId($fp);
        else
            $this->executaInserir($fp);

        // ************************** METODO *******************************
        // cria metodo para editar
        $this->executaEditarId($fp);

        // ************************** METODO *******************************
        // cria metodo para excluir
        if ($this->chavePrimaria)
            $this->executaExcluirId($fp);
        else
            $this->executaExcluir($fp);

        // ************************** METODO *******************************
        // cria metodo para listar
        $this->executaListar($fp);

        fwrite($fp, "}\r\n");
        fwrite($fp, "?>");
        fclose($fp);
    }

    private function executaInserirId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em inserir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$dados{$this->tabelaMetodo} Dados contendo o nome dos campos e seus valores\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function inserir(\$dados{$this->tabelaMetodo})\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Transfer Object (DTO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DTO = new {$this->nomeClasse}DTO;\r\n");
        fwrite($fp, "        // Seta valor as propriedades\r\n");
        $i = 0;
        foreach ($this->colunas as $linha) {
            if ($i != 0) {
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                if (isset($linha['primary_key']) || isset($linha['foreign_key'])) {
                    if ($linha['nulo'] == 'nao') {
                        fwrite($fp, "        if ( !empty(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                        fwrite($fp, "        {\r\n");
                        fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                        fwrite($fp, "        }\r\n");

                        if (isset($linha['primary_key'])) {
                            fwrite($fp, "        else\r\n");
                            fwrite($fp, "        {\r\n");
                            fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
                            fwrite($fp, "        }\r\n");
                        } else if (isset($linha['foreign_key'])) {
                            fwrite($fp, "        else\r\n");
                            fwrite($fp, "        {\r\n");
                            fwrite($fp, "            throw new PDOException(\"Chave estrangeira {$linha['nome_coluna']} nao definida\");\r\n");
                            fwrite($fp, "        }\r\n");
                        }
                    } else {
                        fwrite($fp, "        if ( isset(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                        fwrite($fp, "        {\r\n");
                        fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                        fwrite($fp, "        }\r\n");
                    }
                } else {
                    fwrite($fp, "        if ( isset(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                    fwrite($fp, "        {\r\n");
                    fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                    fwrite($fp, "        }\r\n");
                }
                /* if ( isset($linha['primary_key']) )
                  {
                  fwrite($fp, "        else\r\n");
                  fwrite($fp, "        {\r\n");
                  fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
                  fwrite($fp, "        }\r\n");
                  } */
            }
            $i++;
        }
        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em Inserir\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO->inserir(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        // Seta o ultimo id inserido a propriedade id{$this->tabelaMetodo}\r\n");
        fwrite($fp, "        \$this->ultimoId = \${$this->tabelaPropriedade}DTO->getId{$this->tabelaMetodo}();\r\n");
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \${$this->tabelaPropriedade}DAO->getSql();\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function executaInserir($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em inserir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$dados{$this->tabelaMetodo} Dados contendo o nome dos campos e seus valores\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function inserir(\$dados{$this->tabelaMetodo})\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Transfer Object (DTO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DTO = new {$this->nomeClasse}DTO;\r\n");
        fwrite($fp, "        // Seta valor as propriedades\r\n");
        foreach ($this->colunas as $linha) {
            $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
            if (isset($linha['primary_key']) || isset($linha['foreign_key'])) {
                if ($linha['nulo'] == 'nao') {
                    fwrite($fp, "        if ( !empty(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                    fwrite($fp, "        {\r\n");
                    fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                    fwrite($fp, "        }\r\n");

                    if (isset($linha['primary_key'])) {
                        fwrite($fp, "        else\r\n");
                        fwrite($fp, "        {\r\n");
                        fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
                        fwrite($fp, "        }\r\n");
                    } else if (isset($linha['foreign_key'])) {
                        fwrite($fp, "        else\r\n");
                        fwrite($fp, "        {\r\n");
                        fwrite($fp, "            throw new PDOException(\"Chave estrangeira {$linha['nome_coluna']} nao definida\");\r\n");
                        fwrite($fp, "        }\r\n");
                    }
                } else {
                    fwrite($fp, "        if ( isset(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                    fwrite($fp, "        {\r\n");
                    fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                    fwrite($fp, "        }\r\n");
                }
            } else {
                fwrite($fp, "        if ( isset(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                fwrite($fp, "        }\r\n");
            }
            /* if ( isset($linha['primary_key']) )
              {
              fwrite($fp, "        else\r\n");
              fwrite($fp, "        {\r\n");
              fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
              fwrite($fp, "        }\r\n");
              } */
        }
        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em Inserir\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO->inserir(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \${$this->tabelaPropriedade}DAO->getSql();\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function executaEditarId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em editar\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$dados{$this->tabelaMetodo} Dados contendo o nome dos campos e seus valores\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function editar(\$dados{$this->tabelaMetodo})\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Transfer Object (DTO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DTO = new {$this->nomeClasse}DTO;\r\n");
        fwrite($fp, "        // Seta valor as propriedades\r\n");
        foreach ($this->colunas as $linha) {
            $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);

            if ((isset($linha['primary_key']) || isset($linha['foreign_key'])) && ($linha['nulo'] == 'nao')) {
                fwrite($fp, "        if ( !empty(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                fwrite($fp, "        }\r\n");
            } else {
                fwrite($fp, "        if ( isset(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                fwrite($fp, "        }\r\n");
            }
            if (isset($linha['primary_key'])) {
                fwrite($fp, "        else\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
                fwrite($fp, "        }\r\n");
            }
        }
        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em editar\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO->editar(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \${$this->tabelaPropriedade}DAO->getSql();\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function executaExcluirId($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em excluir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$dados{$this->tabelaMetodo} Dado contendo o nome do campo chave primaria e seu valor\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function excluir(\$dados{$this->tabelaMetodo})\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Transfer Object (DTO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DTO = new {$this->nomeClasse}DTO;\r\n");
        fwrite($fp, "        // Seta valor a propriedade chave primaria\r\n");
        fwrite($fp, "        if ( !empty(\$dados{$this->tabelaMetodo}['id_{$this->tabela}']) )\r\n");
        fwrite($fp, "        {\r\n");
        $nomeMetodo = $this->getNomeMetodo("id_{$this->tabela}");
        fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['id_{$this->tabela}']);\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        else\r\n");
        fwrite($fp, "        {\r\n");
        fwrite($fp, "            throw new PDOException(\"Chave primaria id_{$this->tabela} nao definida\");\r\n");
        fwrite($fp, "        }\r\n");
        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em excluir\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO->excluir(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \${$this->tabelaPropriedade}DAO->getSql();\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function executaExcluir($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em excluir\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$dados{$this->tabelaMetodo} Dado contendo o nome do campo chave primaria e seu valor\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function excluir(\$dados{$this->tabelaMetodo})\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Transfer Object (DTO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DTO = new {$this->nomeClasse}DTO;\r\n");
        fwrite($fp, "        // Seta valor a(s) propriedade(s) chave primaria(s)\r\n");

        foreach ($this->colunas as $linha) {
            if (isset($linha['primary_key'])) {
                fwrite($fp, "        if ( !empty(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']) )\r\n");
                fwrite($fp, "        {\r\n");
                $nomeMetodo = $this->getNomeMetodo($linha['nome_coluna']);
                fwrite($fp, "            \${$this->tabelaPropriedade}DTO->set{$nomeMetodo}(\$dados{$this->tabelaMetodo}['{$linha['nome_coluna']}']);\r\n");
                fwrite($fp, "        }\r\n");
                fwrite($fp, "        else\r\n");
                fwrite($fp, "        {\r\n");
                fwrite($fp, "            throw new PDOException(\"Chave primaria {$linha['nome_coluna']} nao definida\");\r\n");
                fwrite($fp, "        }\r\n");
            }
        }

        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em excluir\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO->excluir(\${$this->tabelaPropriedade}DTO);\r\n");
        fwrite($fp, "        // Seta o sql executado a propriedade sql\r\n");
        fwrite($fp, "        \$this->sql = \${$this->tabelaPropriedade}DAO->getSql();\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function executaListar($fp) {
        fwrite($fp, "    /**\r\n");
        fwrite($fp, "     * Método Responsavel em listar\r\n");
        fwrite($fp, "     * @access public\r\n");
        fwrite($fp, "     * @param array \$campos Array contendo o nome dos campos\r\n");
        fwrite($fp, "     * @param array \$criterios Array contendo o(s) criterio(s) para listagem\r\n");
        fwrite($fp, "     * @param array \$propriedade Array contendo o nome das propriedades \r\n");
        fwrite($fp, "     * @return objeto Retorna o Objeto com o resultado da consulta\r\n");
        fwrite($fp, "     */\r\n");
        fwrite($fp, "    public function listar(\$campos = null, \$criterios = null, \$propriedade = null)\r\n");
        fwrite($fp, "    {\r\n");
        fwrite($fp, "        // Instancia classe Data Access Object (DAO) para {$this->modulo}.{$this->tabela}\r\n");
        fwrite($fp, "        \${$this->tabelaPropriedade}DAO = new {$this->nomeClasse}DAO(\$this->pdo, \$this->criaHistorico);\r\n");
        fwrite($fp, "        // Chama método responsável em listar\r\n");
        fwrite($fp, "        return \${$this->tabelaPropriedade}DAO->listar(\$campos, \$criterios, \$propriedade);\r\n");
        fwrite($fp, "    }\r\n\r\n");
    }

    private function getNomePropriedade($string) {
        $camposEmPartes = explode("_", $string);
        $i = 0;
        $nomePropriedade = '';
        foreach ($camposEmPartes as $parte) {
            if ($i != 0)
                $nomePropriedade .= ucfirst($parte);
            else
                $nomePropriedade = $parte;

            $i++;
        }

        return $nomePropriedade;
    }

    private function getNomeMetodo($string) {
        $camposEmPartes = explode("_", $string);
        $campoNomeMetodo = str_replace(' ', '', ucwords(implode(" ", $camposEmPartes)));
        return $campoNomeMetodo;
    }

}

//Cria arquivos
$modulo = (isset($_GET['modulo'])) ? $_GET['modulo'] : NULL;
$tabela = (isset($_GET['tabela'])) ? $_GET['tabela'] : NULL;

$dao = new CriaDO();
if ($modulo && $tabela)
    $dao->cria($modulo, $tabela);
else
    echo "Devem ser passados os parametros por GET (esquema e tabela) <br/>da seguinte forma ?modulo=NOMEMODULO&tabela=NOMETABELA";
?>